package com.tool.utils;

import org.apache.http.client.utils.DateUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author 酒徒
 * @Version 1.0
 * @data 2025/5/22 13:51
 */
public class FileUploadUtils {
    // 常量定义
    private static final List<String> ALLOWED_EXTENSIONS = Arrays.asList(
            ".jpg", ".jpeg", ".png", ".gif", // 图片格式
            ".mp4", ".mov", ".avi"          // 视频格式
    );
    public static final String[] IMAGE_EXTENSION = { ".jpg", ".jpeg", ".png", ".gif" };
    public static final String[] VIDEO_EXTENSION = { ".mp4", ".mov", ".avi" };

    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException {
        // 校验
        if (!isAllowedExtension(getExtension(file.getOriginalFilename()))) {
            throw new IllegalArgumentException("不支持的文件类型");
        }

        // 生成唯一文件名
        String extension = getExtension(file.getOriginalFilename());
        String fileName = generateFileName(extension);

        //目录
        String type = null;
        if (Arrays.asList(IMAGE_EXTENSION).contains(extension)) {
            type = "image";
        } else if (Arrays.asList(VIDEO_EXTENSION).contains(extension)) {
            type = "video";
        }

        // 创建日期目录（如：2025/05/22）
        String dateDir = DateUtils.formatDate(new Date(), "yyyy/MM/dd");
        String fullDir = baseDir + File.separator + type + File.separator + dateDir;

        // 创建目录（如果不存在）
        File dir = new File(fullDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 保存文件
        File dest = new File(dir, fileName);
        file.transferTo(dest);

        // 返回相对路径（包含日期目录）
        return dateDir + File.separator + fileName;
    }

    // 文件类型校验方法
    private static boolean isAllowedExtension(String extension) {
        return ALLOWED_EXTENSIONS.contains(extension.toLowerCase());
    }

    // 获取文件扩展名
    private static String getExtension(String originalFilename) {
        if (originalFilename == null) return "";
        int lastDotIndex = originalFilename.lastIndexOf(".");
        return lastDotIndex == -1 ? "" : originalFilename.substring(lastDotIndex);
    }

    // 生成唯一文件名（UUID + 时间戳）
    private static String generateFileName(String extension) {
        return UUID.randomUUID().toString().replace("-", "")
               + "_" + System.currentTimeMillis()
               + extension.toLowerCase();
    }

}
